package com.gbb.common;

import android.app.Activity;
import android.os.Handler;
import android.os.Message;

import java.lang.ref.WeakReference;

/**
 * 封装Handler,解决Handle泄露
 * <pre>
 *     使用Handler发生内存泄漏无非是当我们Activity/Fragment或者其他组件销毁后，Handler从异步发来消息后更新UI，然后发生了内存泄漏，发生了异常，
 *     可能导致APP崩溃。所以我们想到在Handler中用弱引用来引用Activity/Fragment.
 *     </br>
 *     普及一下弱引用的常识，弱引用就是不保证不被垃圾回收器回收的对象，它拥有比较短暂的生命周期，
 *     在垃圾回收器扫描它所管辖的内存区域过程中，一旦发现了只具有弱引用的对象，就会回收它的内存，
 *     不过一般情况下，垃圾回收器的线程优先级很低，也就不会很快发现那些只有弱引用的对象。
 *     弱引用可以和一个引用队列(ReferenceQueue)联合使用，如果弱引用的对象被垃圾回收的话，Java虚拟机就会把这个弱引用加入相关的引用队列中。
 *     简单些来说，当我们的Activity/Fragment销毁后这个对象不存在，即被垃圾回收期回收
 * </pre>
 * 摘自{@literal http://blog.csdn.net/yanzhenjie1003/article/details/50992883}
 *
 * @author yanzhenjie
 */
public abstract class BaseHandler extends Handler {

    private WeakReference<Activity> reference;

    public BaseHandler(Activity activity) {
        reference = new WeakReference<>(activity);
    }

    @Override
    public final void handleMessage(Message msg) {
        if(reference != null && reference.get() != null) {
            handleMessage(msg,msg.what);
        }
    }

    /**
     * 处理消息
     *
     * @param msg Message
     * @param what what
     */
    abstract void handleMessage(Message msg,int what);

}
